package com.charging.business.media;

import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;

/**
 * 卡片发行基本数据文件(DF01/0015)解码信息
 * @author lzj
 */
@Data
public class Card0015Model {
    /**
     * 发行方标识(01-08,8,cn)
     * 格式：AAAAAAAA + BBBB + CC + DD
     * AAAAAAAA：省级行政区划代码，2 个汉字的GB2312码的HEX码（8 个字节）,军车、武警车为"军车";
     * BBBB：运营商标识，压缩BCD码，河南为0x4101；
     * CC：保留；
     * DD：密钥分散级别，取值为 01。
     * 样例：0xBAD3C4CF41010001
     */
    @JSONField(ordinal = 1)
    public String issueSign = "";

    /**
     * 卡片类型(09-09,1,n)
     * 22-储值卡；23-记账卡
     */
    @JSONField(ordinal = 2)
    public int cardType = 0;

    /**
     * 卡片版本(10-10,1,cn)
     */
    @JSONField(ordinal = 3)
    public String cardVersion = "";

    /**
     * 卡片网络(11-12,2,cn)
     * 样例:0x4101
     * 	TODO:注意上海、江苏等发行的老ETC卡,此字段有错误,不能用此字段构造20位卡号
     */
    @JSONField(ordinal = 4)
    public String cardWork = "";

    /**
     * 卡片内部编号(13-20,8,cn)
     * 由1 字节“初始化年份”、1 字节“初始化星期”、1 字节“卡片类型”和5字节“卡片序列号”组成
     */
    @JSONField(ordinal = 5)
    public String cardNo = "";

    /**
     * 启用时间(21-24,4,cn)
     * 格式:"0xccyymmdd"
     */
    @JSONField(ordinal = 6)
    public String startTime = "";

    /**
     * 到期时间(25-28,4,cn)
     * 格式:"0xccyymmdd"
     */
    @JSONField(ordinal = 7)
    public String endTime = "";

    /**
     * 车牌号码(29-40,12,an,不含颜色)
     */
    @JSONField(ordinal = 8)
    public String plateNo = "";

    /**
     * 用户类型(41-41,1,n)
     * 0-普通车； 6-公务车； 8-军警车； 10-紧急车； 12-免费；14-车队； 0～20 内其他：自定义；
     * 21-绿通车； 22-联合收割机 ; 23-抢险救灾; 24－J1专用集装箱车；25-大件运输; 26－应急救援车；27－货车列车或半挂汽车列车;28-J2集装箱车
     */
    @JSONField(ordinal = 9)
    public int vehicleUserType = 0;

    /**
     * 车牌颜色(42-42,1,n)
     * 0x00 –蓝色； 0x01–黄色； 0x02 –黑色； 0x03 –白色； 0x04－渐变绿色； 0x05－黄绿双拼色； 0x06－蓝白渐变；0x07～ 0xFF 保留
     */
    @JSONField(ordinal = 10)
    public int plateColor = 0;

    /**
     * 车型(原折扣率值)(43-43,1,n)
     * 1~4：客1~客4；11~16：货1~货6；21~26：专1~专6
     */
    @JSONField(ordinal = 11)
    public int vehicleType = 0;

    /**
     * 备用(44-50,7,an)
     */
    @JSONField(ordinal = 12)
    public String spare = "";

    /**
     * 转换后的ETC卡网络编号
     * 上海等省份早期ETC卡网络编号发行错误,要进行转换, 要用此字段构造20位卡号
     */
    @JSONField(ordinal = 13)
    public String cardNetId = "";

    /**
     * 获取卡内20位用户卡卡号
     * 上海等地区老的用户卡网络编号错误
     */
    @JSONField(serialize = false, deserialize = false)
    public String getOldCardId20() {
        return cardWork + cardNo;
    }

    /**
     * 获取转换后的20位用户卡卡号
     */
    @JSONField(serialize = false, deserialize = false)
    public String getCardId20() {
        return cardNetId + cardNo;
    }

    /**
     * 发行服务机构编码，如四川工行：“510102”
     */
    @JSONField(serialize = false, deserialize = false)
    public String getIssuerId6() {
        return issueSign.substring(8, 8 + 6);
    }

    /**
     * 获取全车牌号码
     * 可设置车牌颜色, 部分老卡颜色编码不对
     *
     * @param platClr - 车牌颜色
     * 0xff - 采用卡内颜色
     * 其他 - 需要设置的颜色
     * @return
     */
    @JSONField(serialize = false, deserialize = false)
    public String getPlateNo(int platClr) {
        if (plateColor == 0xFF) {
            return String.format("%s_%d", plateNo, platClr);
        }
        return String.format("%s_%d", plateNo, plateColor);
    }

    /**
     * 获取全车牌号码
     * 车牌颜色采用卡内颜色
     */
    @JSONField(serialize = false, deserialize = false)
    public String getPlateNo() {
        return getPlateNo(0xff);
    }

    /**
     * 获取卡内车型
     */
    @JSONField(serialize = false, deserialize = false)
    public int getVType(int realVType) {
        if (vehicleType == 0) {
            return realVType;
        }
        return vehicleType;
    }

    /**
     * 转换卡类型为SFR:cpuCardType
     *
     * @return 1:储值卡; 2:记账卡
     */
    public int CpuCardType() {
        if (cardType == 22) {
            return 1;
        }
        return 2;
    }

    public int CpuStartDate() {
        return Integer.parseInt(startTime);
    }

    public int CpuEndDate() {
        return Integer.parseInt(endTime);
    }

    public int CpuVersion() {
        return Integer.parseInt(cardVersion, 16);
    }
}